import json
import os
from model_api import qwen_api_no_search, zhipu_api_no_search
from tqdm import tqdm

path_dir = os.path.dirname(os.path.abspath(__file__))

system_prompt_w_ref = """
你是一位金融出题专家，专注于基于给定的数据进行出题。
我会给你一些信息，包含了:
- 一个专有名词（prop）
- 这个专有名词定义（define_with_ref）
- 专有名词相关的描述（desc）
- 专有名词描述的来源（ref）
你的任务是围绕这个专有名词和相关信息出题目，并给出答案。对于这个专有名词，你需要出3个题目。

第一个题目固定为询问这个专有名词的含义，回答应当是这个专有名词的定义（define_with_ref），一字不差；
第二个题目和第三个题目你可以适当扩散，但依然应当可以用已知的信息回答；

你出的题目应当有评判答案正确与否的标准。你可以选择两种逻辑之一：
RULE-A：必须一字不差才算正确；
RULE-B：大差不差就行；
你出的第一个题目固定为RULE-A；第二三个题目固定为RULE-B。

你的输出格式固定为List[Dict]输出，示例如下：

```json
[
  {
    "question": "我听说净值增长率，这是啥意思",
    "answer": "净值增长率是衡量基金投资业绩的核心指标，通过（期末净值 - 期初净值）与期初净值的比值计算得出，反映特定时期内基金资产的价值变动幅度。",
    "rule": "RULE-A"
  },
  {
    "question": "净值增长率越高的基金就越好吗？",
    "answer": "净值增长率确实是评估基金经理投资能力和基金风险收益特征的重要指标，可用于分析市场环境对基金策略的影响，但需结合风险、费用等其他因素综合判断基金的好坏。",
    "rule": "RULE-B"
  },
  {
    "question": "...",
    "answer": "...",
    "rule": "RULE-B"
  }
]
```
"""

system_prompt_wo_ref = """
你是一位金融出题专家，专注于基于给定的数据进行出题。
我会给你一些信息，包含了:
- 一个专有名词（prop）
- 专有名词相关的描述（desc）
你的任务是围绕这个专有名词和相关信息出题目，并给出答案。对于这个专有名词，你需要出3个题目。

第一个题目固定为询问这个专有名词的含义，回答应当是这个专有名词的定义，尽可能一字不差；
第二个题目和第三个题目你可以适当扩散，但依然应当可以用已知的信息回答；

你出的题目应当有评判答案正确与否的标准。你可以选择两种逻辑之一：
你出的三个题目的评判标准都应当是RULE-B。

你的输出格式固定为List[Dict]输出，示例如下：

```json
[
  {
    "question": "我听说净值增长率，这是啥意思",
    "answer": "净值增长率是衡量基金投资业绩的核心指标，通过（期末净值 - 期初净值）与期初净值的比值计算得出，反映特定时期内基金资产的价值变动幅度。",
    "rule": "RULE-B"
  },
  {
    "question": "净值增长率越高的基金就越好吗？",
    "answer": "净值增长率确实是评估基金经理投资能力和基金风险收益特征的重要指标，可用于分析市场环境对基金策略的影响，但需结合风险、费用等其他因素综合判断基金的好坏。",
    "rule": "RULE-B"
  },
  {
    "question": "...",
    "answer": "...",
    "rule": "RULE-B"
  }
]
```
"""

user_prompt = """
请你基于以下的json，帮我出题目：
{json_str}
"""


def get_question(prop, json_data):
    if json_data['define_with_ref']:
        json_str = json.dumps(json_data, ensure_ascii=False, indent=4)
        convs = [
            {"role": "system", "content": system_prompt_w_ref},
            {"role": "user", "content": user_prompt.format(json_str=json_str)}
        ]
    else:
        json_data.pop('define_with_ref')
        json_data.pop('ref')
        json_str = json.dumps(json_data, ensure_ascii=False, indent=4)
        convs = [
            {"role": "system", "content": system_prompt_wo_ref},
            {"role": "user", "content": user_prompt.format(json_str=json_str)}
        ]
    if 'qwen' in model.lower():
        llm_ans = qwen_api_no_search.qwen_call(model=model, convs=convs)
    elif 'glm' in model.lower():
        llm_ans = zhipu_api_no_search.zhipu_call(model=model, convs=convs)
    else:
        raise ValueError
    llm_ans['prop'] = prop
    return llm_ans


if __name__ == '__main__':
    phase1_model = 'qwen3-max'
    model = 'qwen3-max'
    with open(os.path.join(path_dir, "phase2.5_output", f"{phase1_model}_prop_desc.jsonl"), 'r',
              encoding='utf-8') as fp:
        lines = fp.readlines()
    output_fp = open(os.path.join(path_dir, "phase3_output", f"{model}_questions.jsonl"), 'w', encoding='utf-8')
    for line in tqdm(lines):
        data = json.loads(line)
        prop = data['prop']
        llm_ans = get_question(prop, data)
        llm_ans_str = json.dumps(llm_ans, ensure_ascii=False)
        output_fp.write(llm_ans_str)
        output_fp.write('\n')
    output_fp.close()
